import { _decorator, Component, Node, Vec3, Color } from 'cc';
import { WallManager } from './WallManager';
import { NumberText } from './Core/NumberText';

const { ccclass, property } = _decorator;

@ccclass('EnemyBullet')
export class EnemyBullet extends Component {
    private _speed: number = 400; // 子弹速度
    private _damage: number = 0;
    private _accuracy: number = 0;
    private _targetWm: WallManager | null = null;
    private _targetPos: Vec3 = new Vec3();

    init(ap: number, accuracy: number, targetWm: WallManager) {
        this._damage = ap;
        this._accuracy = accuracy;
        this._targetWm = targetWm;
        
        if (targetWm) {
            // 我们只需要目标的 Y 轴高度作为“地面/墙面”的判定标准
            this._targetPos = targetWm.node.worldPosition.clone(); 
            
            // 可选：如果是2D图片，可能需要调整角度让箭头朝下
            // this.node.angle = -90; 
        }
    }

    update(dt: number) {
        // 如果没有目标，通常还是让它飞完或者直接销毁，这里保留原有逻辑
        if (!this._targetWm || !this._targetWm.node.isValid) {
            this.node.destroy(); 
            return;
        }

        const currentPos = this.node.worldPosition;
        // 既然是垂直往下，目标其实就是“同一X轴，目标的Y轴高度”
        // 这里我们只关心 Y 轴的移动距离
        const moveDist = this._speed * dt;

        // --- 修改点 1: 简单的垂直向下逻辑 ---
        // 这种方式不追踪 X 和 Z，只减少 Y
        const nextY = currentPos.y - moveDist;

        // --- 修改点 2: 判定是否到达或穿过目标高度 ---
        // 如果当前的 Y 减去位移后，小于等于目标的 Y，说明撞上了
        if (nextY <= this._targetPos.y) {
            // 修正位置到目标高度（避免穿模视觉）
            this.node.setWorldPosition(currentPos.x, this._targetPos.y, currentPos.z);
            // 击中
            this.onHit();
        } else {
            // 移动: 保持 X 和 Z 不变，只改变 Y
            this.node.setWorldPosition(currentPos.x, nextY, currentPos.z);
        }
    }

    onHit() {
        if (this._targetWm) {
            const wm = this._targetWm;
            
            // --- 这里可能需要加一个判定 ---
            // 如果箭是垂直落下的，可能落点X轴并不在墙的范围内？
            // 如果你的游戏逻辑是“只要落下就必定打中墙”，则保留下面代码。
            // 如果需要判定范围，可以加 if (Math.abs(this.node.worldPosition.x - wm.node.worldPosition.x) < width) ...

            // 计算闪避
            let hitRate = this._accuracy - wm.dodge;
            let isHit = Math.random() < hitRate;

            if (!isHit) {
                // 显示 Miss，注意位置要在当前子弹的位置
                NumberText.show("miss", this.node.worldPosition, Color.GRAY);
            } else {
                // 计算防御
                let finalDamage = this._damage * (1 - wm.dp / (wm.dp + 100));
                if (finalDamage <= 0) finalDamage = 1;
                wm.hurt(finalDamage);
            }
        }
        
        this.node.destroy(); 
    }
}